import axios from 'axios'
import router from '../router/router'
import { Message } from 'element-ui'

axios.defaults.baseURL = 'http://localhost:30010/'
// 如果请求超过 `timeout` 的时间，请求将被中断
axios.defaults.timeout = 5000
// 表示跨域请求时是否需要使用凭证
axios.defaults.withCredentials = true
// post请求的 数据类型
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8'
// 允许跨域
axios.defaults.headers.post["Access-Control-Allow-Origin-Type"] = "*"

const axiosService = axios.create({})

//请求拦截器
axiosService.interceptors.request.use(
    function(config){
      config.headers.Authorization = sessionStorage.getItem('access_token')
      return config
    },
    function(error){
        return Promise.reject(error)
    }
)

// 响应拦截器
axiosService.interceptors.response.use(
  response => {
    // token失效
    if(response.status === 203 || response.data.code === 401 || response.data.code === 403){
      alert("登录已过期，请重新登录")
      router.push('/portal')
    }
    // 文件下载直接返回
    if (response.status === 200 && response.headers['content-disposition']){
      return response
    }
    if(response.status === 200 && response.data && response.data.success){
      return response.data
    }else{
      responseErrorHandle(response.data.msg || '系统异常,请联系管理员', 'error')
      return response.data
    }
  },
  err => {
    if(JSON.stringify(err).indexOf('Network Error') !== -1){
      responseErrorHandle('系统异常,请联系管理员', 'error')
    }
    if (err.response) {
      // 已知http错误
      if(err.response.status === 203){
        responseErrorHandle('登录已过期，请重新登录', 'error')
        router.push('/portal')
      }
      if(err.response.data.msg){
        responseErrorHandle(err.response.data.msg, 'error')
      }
    } else if (err.request) {
      // 请求已经发送，但未收到响应
      if(err.code === "ECONNABORTED" && err.message.includes('timeout')){
        responseErrorHandle('请求超时，请重试', 'error')
      }
    } else {
      // 其他错误
      responseErrorHandle(err.message || '系统异常，请联系管理员', 'error')
    }
    return Promise.reject(err)
  }
)

function responseErrorHandle(message, type) {
  Message({
    message: message,
    type: type,
  })
}


export default axiosService

